# -*- coding:utf-8  -*-
# @Author: ChenYangMing
# @Time: 2024-08-29

import os
import pandas as pd
import json
import yaml


class FileUtils:
    """
    文件工具类，提供文件读取和写入的方法。
    支持的文件类型包括 txt、csv、xlsx、json 和 yaml。
    """
    @staticmethod
    def read_file(
            file_path,
            file_type='txt',
            encoding='utf-8',
            sheet_name='',
    ):
        """
        根据文件类型和编码格式读取文件内容。
        :param file_path: str, 文件的路径。
        :param file_type: str, 文件类型，支持 'txt', 'csv', 'xlsx', 'json', 'yaml'。
        :param encoding: str, 编码格式，默认为 'utf-8'。
        :param sheet_name: str, 读取的excel工作表名称，默认为空。
        :return: 读取的文件内容，类型取决于文件类型。
        :raises FileNotFoundError: 如果文件不存在。
        """
        if not os.path.isfile(file_path):
            raise FileNotFoundError(f"The file {file_path} does not exist.")

        if file_type == 'csv':
            return pd.read_csv(file_path, encoding=encoding)
        elif file_type == 'xlsx':
            return pd.read_excel(file_path, sheet_name=sheet_name, encoding=encoding, engine='openpyxl')
        elif file_type == 'json':
            with open(file_path, 'r', encoding=encoding) as file:
                return json.load(file)
        elif file_type == 'yaml':
            with open(file_path, 'r', encoding=encoding) as file:
                return yaml.safe_load(file)
        else:  # 默认为文本文件
            with open(file_path, 'r', encoding=encoding) as file:
                return file.read()

    @staticmethod
    def write_file(
            file_path,
            content,
            file_type='txt',
            encoding='utf-8',
    ):
        """
        根据文件格式将内容写入文件。
        :param file_path: str, 要写入的文件路径。
        :param content: 数据内容，可以是DataFrame，字典，列表或字符串。
        :param file_type: str, 文件类型，支持 'txt', 'csv', 'json', 'yaml'。
        :param encoding: str, 编码格式，默认为 'utf-8'。
        """
        if file_type == 'csv':
            pd.DataFrame(content).to_csv(file_path, index=False, encoding=encoding)
        elif file_type == 'json':
            with open(file_path, 'w', encoding=encoding) as file:
                json.dump(content, file, indent=4)
        elif file_type == 'yaml':
            with open(file_path, 'w', encoding=encoding) as file:
                yaml.dump(content, file)
        else:  # 默认为文本文件
            with open(file_path, 'w', encoding=encoding) as file:
                file.write(str(content))

    @staticmethod
    def append_to_file(
            file_path,
            content,
            file_type='txt',
            encoding='utf-8',
    ):
        """
        根据文件格式向文件追加内容。
        :param file_path: str, 文件路径。
        :param content: 要追加的内容，可以是DataFrame，字典，列表或字符串。
        :param file_type: str, 文件类型，支持 'txt', 'csv'。
        :param encoding: str, 编码格式，默认为 'utf-8'。
        """
        if file_type == 'csv':
            pd.DataFrame(content).to_csv(file_path, mode='a', header=False, index=False, encoding=encoding)
        elif file_type == 'txt':
            with open(file_path, 'a', encoding=encoding) as file:
                file.write(str(content))
        else:
            pass  # 对于xlsx, json, yaml等格式的追加操作这里暂不实现


# 调用示例
# file_path = 'data.xlsx'
# sheet_name = 'Sheet1'
# data = FileUtils.read_file(file_path, file_type='xlsx', sheet_name=sheet_name)
